#include "GLogHelper.h"
// #include <windows.h>
// #include <direct.h>
// #include <io.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string>

GLogHelper::GLogHelper() {}

GLogHelper::~GLogHelper() {
    google::RemoveLogSink(custom_sink);
    delete custom_sink;

    // 关闭glog
    google::ShutdownGoogleLogging();
}

void GLogHelper::InitLog(bool singleLog, OutputType type, const std::string& log_fileName) {
    if (log_fileName.empty())
        return;

    // 查找最后一个反斜杠的位置，它之前的就是目录
    std::string::size_type pos = std::string(log_fileName).find_last_of("\\/");
    std::string _log_path = std::string(log_fileName).substr(0, pos);

    if (access(_log_path.c_str(), 0) == -1) {
        mkdir(_log_path.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
    }

    google::InitGoogleLogging("");

    // 设置日志等级
    FLAGS_minloglevel =
        0;  // 0, 1, 2 对应 INFO  WARNING ERROR 最低日志级别（0=INFO，1=WARNING，2=ERROR，3=FATAL）

    if (type == OutputType::Console) {
        FLAGS_logtostderr = true;
        FLAGS_colorlogtostderr = true;
    } else if (type == OutputType::File) {
        // ✅ 仅输出到文件（不输出到终端）
        FLAGS_logtostderr = false;       // 不输出到 stderr
        FLAGS_alsologtostderr = false;   // 不同时输出
        FLAGS_colorlogtostderr = false;  // 禁止终端彩色输出
        FLAGS_stderrthreshold = 3;       // ✅ 不让 ERROR/FATAL 打印到终端
    } else if (type == OutputType::ConsoleAndFile) {
        FLAGS_logtostderr = true;
        FLAGS_alsologtostderr = true;
        FLAGS_colorlogtostderr = true;
    } else {
        // FLAGS_logtostderr = true;       // ✅ 只输出到终端，不写文件
        FLAGS_alsologtostderr = true;   // 错误信息同时输出到终端和文件
        FLAGS_colorlogtostderr = true;  // 设置输出到屏幕的日志显示相应颜色
    }

    // 设置单个日志文件的最大大小为1GB
    // FLAGS_max_log_size = 1000; // 单位为MB

    FLAGS_max_log_size = 10;  // 单位为MB

    // 禁用日志回滚
    FLAGS_stop_logging_if_full_disk = true;

    if (singleLog) {
        custom_sink = new CustomLogSink(log_fileName);
        google::AddLogSink(custom_sink);
    } else {
        std::string info_log_path = _log_path + "/INFO_";
        std::string warn_log_path = _log_path + "/WARNING_";
        std::string error_log_path = _log_path + "/ERROR_";
        std::string fatal_log_path = _log_path + "/FATAL_";

        // 设置特定严重级别的日志的输出目录和前缀
        // 第一个参数为日志级别，第二个参数表示输出目录及日志文件名前缀
        google::SetLogDestination(google::GLOG_INFO, info_log_path.c_str());
        google::SetLogDestination(google::GLOG_WARNING, warn_log_path.c_str());
        google::SetLogDestination(google::GLOG_ERROR, error_log_path.c_str());
        google::SetLogDestination(google::GLOG_FATAL, fatal_log_path.c_str());
    }
}
